package com.aiprompt.demos.controller;

import com.aiprompt.demos.model.vo.dict.DictVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.aiprompt.demos.anotation.AuthCheck;
import com.aiprompt.demos.common.BaseResponse;
import com.aiprompt.demos.common.DeleteRequest;
import com.aiprompt.demos.common.ResultUtils;
import com.aiprompt.demos.constant.UserConstant;
import com.aiprompt.demos.exception.BusinessException;
import com.aiprompt.demos.exception.ErrorCode;
import com.aiprompt.demos.exception.ThrowUtils;
import com.aiprompt.demos.model.domain.Dict;
import com.aiprompt.demos.model.dto.dict.DictAddRequest;
import com.aiprompt.demos.model.dto.dict.DictQueryRequest;
import com.aiprompt.demos.model.dto.dict.DictUpdateRequest;
import com.aiprompt.demos.service.DictService;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;


@RestController
@RequestMapping("/dict")
public class DictController {


    @Resource
    private DictService dictService;
    /**
     * 创建模板
     */
    @PostMapping("/add")
    @AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
    public BaseResponse<Long> addDict(@RequestBody DictAddRequest dictAddRequest) {

        ThrowUtils.throwIf(dictAddRequest == null, ErrorCode.PARAMS_ERROR);
        Dict dict = new Dict();
        BeanUtils.copyProperties(dictAddRequest, dict);

        boolean result = dictService.save(dict);
        ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
        return ResultUtils.success(dict.getId());
    }
    /**
     * 根据 id 获取模板（仅管理员）
     */
    @GetMapping("/get")
    @AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
    public BaseResponse<Dict> getDictById(long id) {
        ThrowUtils.throwIf(id <= 0, ErrorCode.PARAMS_ERROR);
        Dict dict = dictService.getById(id);
        ThrowUtils.throwIf(dict == null, ErrorCode.NOT_FOUND_ERROR);
        return ResultUtils.success(dict);
    }
    /**
     * 删除模板
     */
    @PostMapping("/delete")
    @AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
    public BaseResponse<Boolean> deleteDict(@RequestBody DeleteRequest deleteRequest) {
        if (deleteRequest == null || deleteRequest.getId() <= 0) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }
        boolean b = dictService.removeById(deleteRequest.getId());
        return ResultUtils.success(b);
    }

    /**
     * 更新模板
     */
    @PostMapping("/update")
    @AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
    public BaseResponse<Boolean> updateDict(@RequestBody DictUpdateRequest dictUpdateRequest) {
        ThrowUtils.throwIf(dictUpdateRequest == null || dictUpdateRequest.getId() == null, ErrorCode.PARAMS_ERROR);
        Dict dict = new Dict();
        BeanUtils.copyProperties(dictUpdateRequest, dict);
        boolean result = dictService.updateById(dict);
        ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
        return ResultUtils.success(true);
    }

    /**
     * 分页获取模板列表（仅管理员）
     *
     * @param dictQueryRequest 查询请求参数
     */
    @PostMapping("/list/page/vo")
    public BaseResponse<Page<Dict>> listDictByPage(@RequestBody DictQueryRequest dictQueryRequest) {

        ThrowUtils.throwIf(dictQueryRequest == null, ErrorCode.PARAMS_ERROR);
        long current = dictQueryRequest.getCurrent();
        long pageSize = dictQueryRequest.getPageSize();

        System.out.println(current+" "+pageSize);
        Page<Dict> dictPage = dictService.page(new Page<>(current, pageSize),
                dictService.getQueryWrapper(dictQueryRequest));


        return ResultUtils.success(dictPage);
    }


    /**
     * 获取模板分类列表
     */
    @GetMapping("/categories")
    public BaseResponse<List<String>> getDictCategories() {

        List<Dict> dictList = dictService.getBaseMapper().selectList(null);
        // 2. 提取分类字段（假设你的实体类字段名为 category）
        List<String> categories = dictList.stream()
                .map(Dict::getCategory)
                .distinct() // 去重
                .collect(Collectors.toList());

        return ResultUtils.success(categories);
    }

    /**
     * 初始化模板数据
     */
    @PostMapping("/init-templates")
    public BaseResponse<String> initTemplates() {
        try {
            // 清空现有模板数据
            dictService.remove(null);

            List<Dict> templates = new ArrayList<>();

            // 1. 写作助手模板
            Dict writingTemplate = new Dict();
            writingTemplate.setTitle("写作助手");
            writingTemplate.setDescription("帮助用户创作各类文章的通用模板");
            writingTemplate.setCategory("写作");
            writingTemplate.setTags("写作,文章,创作");
            writingTemplate.setContent("你是一个专业的写作助手。请根据用户提供的主题和要求，帮助用户创作高质量的文章。\n\n用户需求：{user_input}\n\n请按照以下结构来组织文章：\n1. 引人入胜的开头\n2. 逻辑清晰的主体内容\n3. 有力的结尾\n\n注意保持语言流畅，逻辑严密，内容丰富。");
            writingTemplate.setTemplateKeys("user_input");
            templates.add(writingTemplate);

            // 2. 代码解释器模板
            Dict codeTemplate = new Dict();
            codeTemplate.setTitle("代码解释器");
            codeTemplate.setDescription("帮助理解和解释各种编程代码");
            codeTemplate.setCategory("编程");
            codeTemplate.setTags("编程,代码,解释");
            codeTemplate.setContent("你是一个专业的代码解释器。请分析用户提供的代码，并提供详细的解释。\n\n代码：\n```\n{user_input}\n```\n\n请按照以下格式进行解释：\n1. 代码功能概述\n2. 逐行代码解释\n3. 关键技术点说明\n4. 可能的优化建议\n\n请用通俗易懂的语言解释，适合初学者理解。");
            codeTemplate.setTemplateKeys("user_input");
            templates.add(codeTemplate);

            // 3. 商业分析师模板
            Dict businessTemplate = new Dict();
            businessTemplate.setTitle("商业分析师");
            businessTemplate.setDescription("专业的商业问题分析和解决方案");
            businessTemplate.setCategory("商业");
            businessTemplate.setTags("商业,分析,策略");
            businessTemplate.setContent("你是一个资深的商业分析师。请根据用户提供的商业问题，进行专业的分析和建议。\n\n问题描述：{user_input}\n\n请按照以下框架进行分析：\n1. 问题定义和背景分析\n2. 市场环境和竞争态势\n3. SWOT分析\n4. 解决方案和建议\n5. 风险评估和应对策略\n\n请提供数据支撑和实际案例。");
            businessTemplate.setTemplateKeys("user_input");
            templates.add(businessTemplate);

            // 4. 学习导师模板
            Dict tutorTemplate = new Dict();
            tutorTemplate.setTitle("学习导师");
            tutorTemplate.setDescription("个性化学习指导和计划制定");
            tutorTemplate.setCategory("教育");
            tutorTemplate.setTags("学习,教育,指导");
            tutorTemplate.setContent("你是一个耐心的学习导师。请根据用户的学习需求，制定个性化的学习计划和指导。\n\n学习需求：{user_input}\n\n请提供：\n1. 学习目标分解\n2. 学习路径规划\n3. 学习资源推荐\n4. 学习方法建议\n5. 进度评估标准\n\n请考虑用户的基础水平和时间安排。");
            tutorTemplate.setTemplateKeys("user_input");
            templates.add(tutorTemplate);

            // 5. 创意设计师模板
            Dict designTemplate = new Dict();
            designTemplate.setTitle("创意设计师");
            designTemplate.setDescription("创意设计方案和建议");
            designTemplate.setCategory("设计");
            designTemplate.setTags("设计,创意,视觉");
            designTemplate.setContent("你是一个富有创意的设计师。请根据用户的设计需求，提供创意方案和设计建议。\n\n设计需求：{user_input}\n\n请提供：\n1. 设计理念和风格定位\n2. 色彩搭配建议\n3. 布局和构图方案\n4. 创意元素建议\n5. 实现技术要点\n\n请考虑目标用户和使用场景。");
            designTemplate.setTemplateKeys("user_input");
            templates.add(designTemplate);

            // 6. 数据分析专家模板
            Dict dataTemplate = new Dict();
            dataTemplate.setTitle("数据分析专家");
            dataTemplate.setDescription("专业的数据分析和洞察");
            dataTemplate.setCategory("数据");
            dataTemplate.setTags("数据,分析,统计");
            dataTemplate.setContent("你是一个专业的数据分析专家。请根据用户提供的数据问题，进行深入分析。\n\n数据问题：{user_input}\n\n请按照以下步骤分析：\n1. 数据理解和预处理\n2. 探索性数据分析\n3. 统计分析和建模\n4. 结果解释和洞察\n5. 行动建议\n\n请使用专业的分析方法和工具。");
            dataTemplate.setTemplateKeys("user_input");
            templates.add(dataTemplate);

            // 7. 翻译专家模板
            Dict translateTemplate = new Dict();
            translateTemplate.setTitle("翻译专家");
            translateTemplate.setDescription("专业的多语言翻译服务");
            translateTemplate.setCategory("翻译");
            translateTemplate.setTags("翻译,语言,多语种");
            translateTemplate.setContent("你是一个专业的翻译专家，精通多种语言。请根据用户的翻译需求，提供准确、流畅的翻译。\n\n翻译内容：{user_input}\n目标语言：{target_language}\n\n请注意：\n1. 保持原文的语义和语调\n2. 考虑文化背景和语境\n3. 使用地道的表达方式\n4. 如有专业术语，请保持准确性\n5. 必要时提供多种翻译选择");
            translateTemplate.setTemplateKeys("user_input,target_language");
            templates.add(translateTemplate);

            // 8. 产品经理模板
            Dict productTemplate = new Dict();
            productTemplate.setTitle("产品经理");
            productTemplate.setDescription("产品规划和需求分析专家");
            productTemplate.setCategory("产品");
            productTemplate.setTags("产品,需求,规划");
            productTemplate.setContent("你是一个经验丰富的产品经理。请根据用户的产品需求，提供专业的产品分析和建议。\n\n产品需求：{user_input}\n\n请按照以下框架分析：\n1. 需求分析和用户画像\n2. 市场调研和竞品分析\n3. 功能规划和优先级排序\n4. 技术可行性评估\n5. 商业模式和盈利点\n6. 风险识别和应对方案\n\n请提供具体可执行的建议。");
            productTemplate.setTemplateKeys("user_input");
            templates.add(productTemplate);

            // 批量保存模板
            dictService.saveBatch(templates);

            return ResultUtils.success("模板数据初始化成功，共创建 " + templates.size() + " 个模板");
        } catch (Exception e) {
            return new BaseResponse<>(ErrorCode.SYSTEM_ERROR.getCode(), null, "初始化失败: " + e.getMessage());
        }
    }



    /**
     * 测试获取模板列表
     */
    @GetMapping("/test-list")
    public BaseResponse<Page<Dict>> testList() {
        DictQueryRequest request = new DictQueryRequest();
        request.setCurrent(1);
        request.setPageSize(10);

        Page<Dict> dictPage = dictService.page(new Page<>(request.getCurrent(), request.getPageSize()),
                dictService.getQueryWrapper(request));

        return ResultUtils.success(dictPage);
    }

    /**
     * 获取模板统计数据
     */
    @GetMapping("/stats")
    public BaseResponse<Object> getDictStats() {
        try {
            // 获取总模板数
            long totalTemplates = dictService.count();

            // 获取今日新增模板数
            QueryWrapper<Dict> todayWrapper = new QueryWrapper<>();
            todayWrapper.ge("createTime", java.time.LocalDate.now().atStartOfDay());
            long todayTemplates = dictService.count(todayWrapper);

            // 获取本月新增模板数
            QueryWrapper<Dict> monthWrapper = new QueryWrapper<>();
            monthWrapper.ge("createTime", java.time.LocalDate.now().withDayOfMonth(1).atStartOfDay());
            long monthTemplates = dictService.count(monthWrapper);

            // 构建统计数据
            java.util.Map<String, Object> stats = new java.util.HashMap<>();
            stats.put("totalTemplates", totalTemplates);
            stats.put("todayTemplates", todayTemplates);
            stats.put("monthTemplates", monthTemplates);

            return ResultUtils.success(stats);
        } catch (Exception e) {
            return new BaseResponse<>(ErrorCode.SYSTEM_ERROR.getCode(), null, "获取统计数据失败: " + e.getMessage());
        }
    }

    /**
     * 获取热门模板
     */
    @GetMapping("/popular")
    public BaseResponse<List<DictVO>> getPopularDicts(@RequestParam(defaultValue = "10") int limit) {
        try {
            QueryWrapper<Dict> queryWrapper = new QueryWrapper<>();
            queryWrapper.orderByDesc("createTime"); // 由于没有浏览量字段，按创建时间排序
            queryWrapper.last("LIMIT " + limit);

            List<Dict> dicts = dictService.list(queryWrapper);
            List<DictVO> dictVOList = dicts.stream()
                    .map(dict -> {
                        DictVO dictVO = new DictVO();
                        BeanUtils.copyProperties(dict, dictVO);
                        return dictVO;
                    })
                    .collect(java.util.stream.Collectors.toList());

            return ResultUtils.success(dictVOList);
        } catch (Exception e) {
            return new BaseResponse<>(ErrorCode.SYSTEM_ERROR.getCode(), null, "获取热门模板失败: " + e.getMessage());
        }
    }

}
